package comment

import (
	models "HeadLineNews/proto_models/app/comment_model"
	"HeadLineNews/resp"
	"github.com/gin-gonic/gin"
)

type Server interface {
	AddCommentHandler(c *gin.Context)
	RetrieveNewsCommentHandler(c *gin.Context)
	RetrieveNewsFloorCommentHandler(c *gin.Context)
}

type server struct {
	repo Repo
	ctx  Ctx
}

func NewServer() Server {
	return &server{
		repo: NewRepo(),
		ctx:  NewCtx(),
	}
}

// AddCommentHandler 用户评论
func (s *server) AddCommentHandler(c *gin.Context) {
	// 解析参数
	p, err := s.ctx.ParseParamUserComment(c)
	if err != nil {
		return
	}
	// 检查合法的 newsId
	if err = s.repo.CheckNewExists(c, p.NewsId); err != nil {
		return
	}
	// 检查 replyId 是否合法，存在的话返回 floorId
	var floorId string
	if p.ReplyId != "" {
		if floorId, err = s.repo.CheckReplyIdExists(c, p.ReplyId); err != nil {
			return
		}
	}
	// 保存评论
	if err = s.repo.InsertComment(c, p, floorId); err != nil {
		return
	}
	resp.Success(c, nil)
}

// RetrieveNewsCommentHandler 检索某一条新闻的评论
func (s *server) RetrieveNewsCommentHandler(c *gin.Context) {
	// 解析参数
	p, err := s.ctx.ParseParamRetrieveNewsComment(c)
	if err != nil {
		return
	}
	// 检查新闻是否存在
	if err = s.repo.CheckNewsExists(c, p.NewsId); err != nil {
		return
	}
	// 拿到新闻评论
	var data *models.ResponseRetrieveNewsComment
	if data, err = s.repo.RetrieveNewsComments(c, p); err != nil {
		return
	}
	resp.Success(c, data)
}

// RetrieveNewsFloorCommentHandler 检索某一条新闻的某一层楼的评论
func (s *server) RetrieveNewsFloorCommentHandler(c *gin.Context) {
	// 解析参数
	p, err := s.ctx.ParseParamRetrieveNewsFloorComment(c)
	if err != nil {
		return
	}
	// 检查新闻楼层是否存在
	if err = s.repo.CheckFloorCommentExists(c, p.NewsId, p.FloorId); err != nil {
		return
	}
	// 拿到楼层评论
	var data *models.ResponseRetrieveNewsFloorComment
	if data, err = s.repo.RetrieveNewsFloorComments(c, p); err != nil {
		return
	}
	resp.Success(c, data)
}
